home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HPAVC
/
HPAVC CD-ROM.iso
/
PRUS101.ZIP
/
FKBD.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1994-07-20
|
21KB
|
560 lines
Unit FKBD; { FIDO Unit for keyboard handling and manipulation }
(***************************************************************************
RELEASE 1.03 - as contained in the file PRUS100.LZH
by Orazio Czerwenka, 2:2450/540.55, GERMANY
--------------------------------------------
organized for Fido's PASCAL related echoes
--------------------------------------------
05/22/1994 to --/--/---- by Orazio Czerwenka, 2:2450/540.55, GERMANY
As far as third party copyrights are not violated this
source code is hereby placed to the public domain. Use
it whatever way you want, but use AT YOUR OWN RISK.
In case you should modify the source rather send your
modifications to the unit's current organizer (see above for
NM address) than to spread it on your own. This will help to
keep the unit updated and grant a certain standard to all
other users as well.
The unit is currently still under work. So it might greatly
benefit of your participation.
Those who contributed to the following piece of source,
listed in alphabethical order:
================================================================
Martin Austermeier (Unit ReadKBD), Orazio Czerwenka, German
Borland HOST Langen (buffstuff.pas,flushkey.pas), Max
Maischein (Units CRT2.PAS and CHEAPCRT.PAS)...
================================================================
YOUR NAME WILL APPEAR HERE IF YOU CONTRIBUTE USEFUL SOURCE.
Special thanx to Max Maischein and Paul Schubert for pointing
out the advantages of word based keyboard related operations.
Credits in your own programs are owed to Max Maischein as
demanded in his Units CRT2 and CHEAPCRT and to Borland in
general as well as to Martin Austermeier for his PD unit
ReadKBD.
***************************************************************************)
{$I FDEFINE.DEF}
interface
type
KbdBuff = array[30..62] of byte; { doesn't work as [0..32] ! why? }
CONST
{ key codes }
NUL = $0000; BKSPC = $0E08; TAB = $0F09;
CR = $1C0D; ESC = $011B; SPC = $3920;
{ enhanced key codes }
SHIFT_TAB = $0F00;
CTRL_TAB = $9400;
HOME = $4700; UP = $4800; PGUP = $4900;
LEFT = $4B00; MIDDLE = $4C35; RIGHT = $4D00;
ENDE = $4F00; DOWN = $5000; PGDN = $5100;
INS = $5200; DEL = $5300;
GRAYPLUS = $4E2B; GRAYMINUS = $4A2D; GRAYDIV = $E02F;
GRAYMUL = $372A; GRAYCR = $E00D;
F1 = $3B00; F2 = $3C00; F3 = $3D00;
F4 = $3E00; F5 = $3F00; F6 = $4000;
F7 = $4100; F8 = $4200; F9 = $4300;
F10 = $4400; F11 = $8500; F12 = $8600;
SHIFT_F1 = $5400; SHIFT_F2 = $5500; SHIFT_F3 = $5600;
SHIFT_F4 = $5700; SHIFT_F5 = $5800; SHIFT_F6 = $5900;
SHIFT_F7 = $5A00; SHIFT_F8 = $5B00; SHIFT_F9 = $5C00;
SHIFT_F10 = $5D00; SHIFT_F11 = $8700; SHIFT_F12 = $8800;
CTRL_F1 = $5E00; CTRL_F2 = $5F00; CTRL_F3 = $6000;
CTRL_F4 = $6100; CTRL_F5 = $6200; CTRL_F6 = $6300;
CTRL_F7 = $6400; CTRL_F8 = $6500; CTRL_F9 = $6600;
CTRL_F10 = $6700; CTRL_F11 = $8900; CTRL_F12 = $8A00;
ALT_F1 = $6800; ALT_F2 = $6900; ALT_F3 = $6A00;
ALT_F4 = $6B00; ALT_F5 = $6C00; ALT_F6 = $6D00;
ALT_F7 = $6E00; ALT_F8 = $6F00; ALT_F9 = $7000;
ALT_F10 = $7100; ALT_F11 = $8B00; ALT_F12 = $8C00;
CTRL_0 = $0B00; CTRL_1 = $0200; CTRL_2 = $0300;
CTRL_3 = $0400; CTRL_4 = $0500; CTRL_5 = $0600;
CTRL_6 = $071E; CTRL_7 = $0800; CTRL_8 = $0900;
CTRL_9 = $0A00; CTRL_SZ = $0C1F; CTRL_APOST = $0D00;
CTRL_BKSPC = $0E7F;
CTRL_CR = $1C0A;
CTRL_A = $1E01; CTRL_B = $3002; CTRL_C = $2E03;
CTRL_D = $2004; CTRL_E = $1205; CTRL_F = $2106;
CTRL_G = $2207; CTRL_H = $2308; CTRL_I = $1709;
CTRL_J = $240A; CTRL_K = $250B; CTRL_L = $260C;
CTRL_M = $320D; CTRL_N = $310E; CTRL_O = $180F;
CTRL_P = $1910; CTRL_Q = $1011; CTRL_R = $1312;
CTRL_S = $1F13; CTRL_T = $1414; CTRL_U = $1615;
CTRL_V = $2F16; CTRL_W = $1117; CTRL_X = $2D18;
CTRL_Y = $1519; CTRL_Z = $2C1A;
ALT_ESC = $0100;
ALT_0 = $8100; ALT_1 = $7800; ALT_2 = $7900;
ALT_3 = $7A00; ALT_4 = $7B00; ALT_5 = $7C00;
ALT_6 = $7D00; ALT_7 = $7E00; ALT_8 = $7F00;
ALT_9 = $8000; ALT_SZ = $8200; ALT_APOST = $8300;
ALT_BKSPC = $0E00;
ALT_CR = $1C00;
ALT_A = $1E00; ALT_B = $3000; ALT_C = $2E00;
ALT_D = $2000; ALT_E = $1200; ALT_F = $2100;
ALT_G = $2200; ALT_H = $2300; ALT_I = $1700;
ALT_J = $2400; ALT_K = $2500; ALT_L = $2600;
ALT_M = $3200; ALT_N = $3100; ALT_O = $1800;
ALT_P = $1900; ALT_Q = $1000; ALT_R = $1300;
ALT_S = $1F00; ALT_T = $1400; ALT_U = $1600;
ALT_V = $2F00; ALT_W = $1100; ALT_X = $2D00;
ALT_Y = $1500; ALT_Z = $2C00;
ALT_SPC = $3900;
CTRL_UP = $8D00; CTRL_DOWN = $9100; CTRL_LEFT = $7300;
CTRL_RIGHT = $7400; CTRL_HOME = $7700; CTRL_END = $7500;
CTRL_DEL = $9300; CTRL_INS = $9200;
IDE_INS = $0500; IDE_DEL = $0700;
IDE_CTRL_INS = $0400; IDE_CTRL_DEL = $0600;
IDE_ALT_SPC = $0200;
ALT_UP = $9800; ALT_DOWN = $A000; ALT_LEFT = $9B00;
ALT_RIGHT = $9D00;
var
KBDHead : integer absolute $0000:$041A;
KBDTail : integer absolute $0000:$041C;
KBDSeg : KbdBuff absolute $0000:$041E;
function ScrlPressed : Boolean; function ScrlActive : Boolean;
function NumPressed : Boolean; function NumActive : Boolean;
function CapsPressed : Boolean; function CapsActive : Boolean;
function InsPressed : Boolean; function InsActive : Boolean;
function ShiftPressed: Boolean;
function LeftShiftPressed: Boolean;
function RightShiftPressed: Boolean;
function CtrlPressed : Boolean;
{ Original author: Max Maischein }
Inline(
$31/$F6/ {XOR SI,SI }
$8E/$C6/ {MOV ES,SI }
$26/ {ES: }
$A0/$17/$04/ {MOV AL,[0417] }
$A8/$04/ {TEST AL,04 }
$B0/$01/ {MOV AL,01 }
$75/$02/ {JNZ $+2 }
$FE/$C8 {DEC AL }
);
function LeftCTRLPressed: Boolean;
function RightCTRLPressed: Boolean;
function ALTPressed : Boolean;
{ Original author: Max Maischein }
Inline(
$31/$F6/ {XOR SI,SI }
$8E/$C6/ {MOV ES,SI }
$26/ {ES: }
$A0/$17/$04/ {MOV AL,[0417] }
$A8/$08/ {TEST AL,08 }
$B0/$01/ {MOV AL,01 }
$75/$02/ {JNZ $+2 }
$FE/$C8 {DEC AL }
);
function LeftALTPressed: Boolean;
function RightALTPressed: Boolean;
function EnhancedKBDPresent : Boolean;
function ExtendedKeysAllowed: Boolean;
procedure EnableExtendedKeys;
procedure DisableExtendedKeys;
function KeyPressed : Boolean;
function ReadKey : Char;
function PeekKey : Char;
function ReadKeyWord : Word;
function PeekKeyWord : Word;
function NormalKey : char; { like readkey, but excepts only normal keys }
procedure ClrKbd; { clear the keyboard buffer }
procedure Char2KBD (ch:char;code:byte); { put Char end extended code }
procedure Word2Kbd(w: Word); { put Word to buffer }
implementation
const
NormalKeyExceptions = [#13,#27]; { Insert all chars < 32 to be excepted by
NormalKey here }
var
KBDFlag0 : Byte Absolute $40:$17;
KBDFlag1 : Byte Absolute $40:$18;
KBDFlag2 : Byte Absolute $40:$97;
KBDFlag3 : Byte Absolute $40:$96;
keyCmd, { "base command" for int 16h }
extKey : Byte; { buffer for extended keys }
function ScrlPressed : Boolean;
{ Original author: Max Maischein }
begin ScrlPressed := (KBDFlag1 AND 16) <> 0; end;
function ScrlActive : Boolean;
{ Original author: Max Maischein }
begin ScrlActive := (KBDFlag0 AND 16) <> 0; end;
function NumPressed : Boolean;
{ Original author: Max Maischein }
begin NumPressed := (KBDFlag1 AND 32) <> 0; end;
function NumActive : Boolean;
{ Original author: Max Maischein }
begin NumActive := (KBDFlag0 AND 32) <> 0; end;
function CapsPressed : Boolean;
{ Original author: Max Maischein }
begin CapsPressed := (KBDFlag1 AND 64) <> 0; end;
function CapsActive : Boolean;
{ Original author: Max Maischein }
begin CapsActive := (KBDFlag0 AND 64) <> 0; end;
function InsActive : Boolean;
{ Original author: Max Maischein }
begin InsActive := (KBDFlag0 AND 128) <> 0; end;
function InsPressed : Boolean;
{ Original author: Max Maischein }
begin InsPressed := (KBDFlag1 AND 128) <> 0; end;
function LeftShiftPressed: Boolean;
{ Original author: Orazio Czerwenka }
begin LeftShiftPressed:= (KBDFlag0 AND 2) <> 0; end;
function RightShiftPressed: Boolean;
{ Original author: Orazio Czerwenka }
begin RightShiftPressed:= (KBDFlag0 AND 1) <> 0; end;
function ShiftPressed: Boolean;
{ Original author: Orazio Czerwenka }
begin ShiftPressed:= RightShiftPressed OR LeftShiftPressed; end;
function LeftCTRLPressed: Boolean;
{ Original author: Orazio Czerwenka }
begin LeftCTRLPressed:= (KBDFlag1 AND 1) <> 0; end;
function RightCTRLPressed: Boolean;
{ Original author: Orazio Czerwenka }
begin RightCTRLPressed:= (KBDFlag3 AND 4) <> 0; end;
function LeftALTPressed: Boolean;
{ Original author: Orazio Czerwenka }
begin LeftALTPressed:= (KBDFlag1 AND 2) <> 0; end;
function RightALTPressed: Boolean;
{ Original author: Orazio Czerwenka }
begin RightALTPressed:= (KBDFlag3 AND 8) <> 0; end;
{ ************************************************************************** }
{ ╒═════════════════════════════════════════════════════════════════════════╕}
{ │ EnhancedKBDPresent : Boolean │}
{ ╘═════════════════════════════════════════════════════════════════════════╛}
function EnhancedKBDPresent : boolean;
{ Original author: Max Maischein, Unit CRT2;
modificatons by Orazio Czerwenka according to
Martin Austermeier's Unit ReadKBD }
begin
asm
sub al, al
mov [extKey], al { init ReadKey }
mov [keyCmd], al { normal Cmd (0) }
mov al, 0FFh
mov ah, 12h { get shift states :}
int 16h
cmp al, 0FFh { shifts? }
je @@NoEnhKbd { not supported -> }
mov @result, 0h { TRUE }
@@NoEnhKbd:
mov @result, 1h { FALSE }
end;
end;
{ ************************************************************************** }
{ ╒═════════════════════════════════════════════════════════════════════════╕}
{ │ ExtendedKeysAllowed: Boolean │}
{ ╘═════════════════════════════════════════════════════════════════════════╛}
function ExtendedKeysAllowed: Boolean;
{ Original author: Orazio Czerwenka }
begin
ExtendedKeysAllowed:= (keyCmd = $10);
end;
{ ************************************************************************** }
{ ╒═════════════════════════════════════════════════════════════════════════╕}
{ │ EnableExtendedKeys │}
{ ╘═════════════════════════════════════════════════════════════════════════╛}
procedure EnableExtendedKeys;
{ Original author: Orazio Czerwenka }
begin
if EnhancedKBDPresent then
asm
mov [keyCmd], 10h { enhanced keyboard support }
end;
end;
{ ************************************************************************** }
{ ╒═════════════════════════════════════════════════════════════════════════╕}
{ │ DisableExtendedKeys │}
{ ╘═════════════════════════════════════════════════════════════════════════╛}
procedure DisableExtendedKeys; assembler;
{ Original author: Orazio Czerwenka }
ASM
mov [keyCmd], 0h { disable enhanced keyboard support }
END;
{ ************************************************************************** }
{ ╒═════════════════════════════════════════════════════════════════════════╕}
{ │ KeyPressed : Boolean │}
{ ╘═════════════════════════════════════════════════════════════════════════╛}
function KeyPressed : Boolean; assembler;
{ Original author: Martin Austermeier }
ASM
cmp [extKey], 0 { extended key pending? }
jne @@True { yes -> }
mov ah, [keyCmd] { 0/10 }
inc ah { keypressed function (01/11) }
int 16h
mov al, FALSE { key available? }
jz @@Exit { no -> }
@@True:
mov al, TRUE
@@Exit:
END; { KeyPressed }
{ ************************************************************************** }
{╒═════════════════════════════════════════════════════════════════════════╕ }
{│ ReadKey : Char; │ }
{╘═════════════════════════════════════════════════════════════════════════╛ }
function ReadKey : Char; assembler;
{ Original author: Martin Austermeier }
ASM
mov al, [extKey] { get saved ext.key }
mov [extKey], 0 { reset }
or al, al { previous = extended key? }
jne @@End { nope -> }
mov ah, [keyCmd] { read key }
int 16h
cmp al, 0E0h { extended keyboard, cursor keys }
jne @@NoE0 { no cursor key -> }
or ah, ah { "α" (E0) allowed }
jnz @@Ext
@@NoE0:
or al, al { LowByte=0? }
jnz @@End { no, valid key -> }
@@Ext:
sub al, al { return 0 }
mov [extKey], AH { save extended key }
@@End:
xor ah, ah { return AL only }
END; { ReadKey }
{ ************************************************************************** }
{╒═════════════════════════════════════════════════════════════════════════╕ }
{│ PeekKey : Char; │ }
{╘═════════════════════════════════════════════════════════════════════════╛ }
function PeekKey : Char; assembler;
{ Original author: Martin Austermeier,
modifications made by Orazio Czerwenka
based upon ReadKey }
ASM
mov al, [extKey] { get saved ext.key }
mov [extKey], 0 { reset }
or al, al { previous = extended key? }
jne @@End { nope -> }
mov ah, [keyCmd] { read key }
inc ah { peek key instead }
int 16h
cmp al, 0E0h { extended keyboard, cursor keys }
jne @@NoE0 { no cursor key -> }
or ah, ah { "α" (E0) allowed }
jnz @@Ext
@@NoE0:
or al, al { LowByte=0? }
jnz @@End { no, valid key -> }
@@Ext:
sub al, al { return 0 }
mov [extKey], AH { save extended key }
@@End:
xor ah, ah { return AL only }
END; { ReadKey }
{ ************************************************************************** }
{╒═════════════════════════════════════════════════════════════════════════╕ }
{│ ReadKeyWord : Word; │ }
{╘═════════════════════════════════════════════════════════════════════════╛ }
function ReadKeyWord : Word; assembler;
{ Original author: Martin Austermeier
modifications based upon ReadKey by
Orazio Czerwenka }
ASM
(*
mov al, [extKey] { get saved ext.key }
mov [extKey], 0 { reset }
or al, al { previous = extended key? }
jne @@End { nope -> }
*)
mov ah, [keyCmd] { read key }
int 16h
cmp al, 0E0h { extended keyboard, cursor keys }
jne @@NoE0 { no cursor key -> }
or ah, ah { "α" (E0) allowed }
jnz @@Ext
@@NoE0:
or al, al { LowByte=0? }
jnz @@End { no, valid key -> }
@@Ext:
sub al, al { return 0 }
mov [extKey], AH { save extended key }
@@End:
(* xor ah, ah { return AL only }*)
END; { ReadKey }
{ ************************************************************************** }
{╒═════════════════════════════════════════════════════════════════════════╕ }
{│ PeekKeyWord : Word; │ }
{╘═════════════════════════════════════════════════════════════════════════╛ }
function PeekKeyWord : Word; assembler;
{ Original author: Martin Austermeier
modifications based upon ReadKey by
Orazio Czerwenka }
ASM
(*
mov al, [extKey] { get saved ext.key }
mov [extKey], 0 { reset }
or al, al { previous = extended key? }
jne @@End { nope -> }
*)
mov ah, [keyCmd] { read key }
inc ah { peek key instead }
int 16h
cmp al, 0E0h { extended keyboard, cursor keys }
jne @@NoE0 { no cursor key -> }
or ah, ah { "α" (E0) allowed }
jnz @@Ext
@@NoE0:
or al, al { LowByte=0? }
jnz @@End { no, valid key -> }
@@Ext:
sub al, al { return 0 }
mov [extKey], AH { save extended key }
@@End:
(* xor ah, ah { return AL only }*)
END; { ReadKey }
{ ************************************************************************** }
function NormalKey : char;
{ Original author: Max Maischein, Unit CRT2;
modifications by Orazio Czerwenka }
var
ch : word;
b : boolean;
begin
b:= false;
Repeat
ch := word(readKey);
If (lo(ch) <> 0) and ((lo(ch) > 31) or (chr(ch) in NormalKeyExceptions))
then b:= true
else ch:= word(readkey);
Until b;
if not (chr(ch) in NormalKeyExceptions)
then NormalKey:= chr(lo(ch))
else NormalKey:= #13;
end;
{ ************************************************************************** }
procedure ClrKbd; assembler; { adapted of FLUSHKEY.PAS from }
{ Modifications: Orazio Czerwenka } { Borland-Net host, Langen }
asm
mov ax, 0Ch
shl ax, 8
or ax, ax
mov dx, 00FFh
int 21h
end;
{ ************************************************************************** }
procedure Char2Kbd(ch:char;code:byte); { adapted of BUFSTUFF.PAS from }
{ Modifications: Orazio Czerwenka } { Borland-Net host, Langen }
var
TmpTail : integer;
begin
TmpTail:= KBDTail; { store the current end of buffer }
KBDTail:= KBDTail + 2; { incriment to next position }
if KBDHead = KBDTail then { if the buffer is full (?) ... }
begin
KBDTail:= TmpTail; { ... restore the previous value }
end
else
begin
KbdSeg[TmpTail]:= ord(ch); { put ASCII value in buffer }
KbdSeg[TmpTail+1]:= code; { put extended key code }
if KBDTail > 60 { reached buffer's end ? ... }
then KBDTail:= 30; { ... wrap to first position ! }
end;
end;
{ ************************************************************************** }
procedure Word2Kbd(w: Word); { adapted of BUFSTUFF.PAS from }
{ Modifications: Orazio Czerwenka } { Borland-Net host, Langen }
var
TmpTail : integer;
begin
TmpTail:= KBDTail; { store the current end of buffer }
KBDTail:= KBDTail + 2; { incriment to next position }
if KBDHead = KBDTail then { if the buffer is full (?) ... }
begin
KBDTail:= TmpTail; { ... restore the previous value }
end
else
begin
KbdSeg[TmpTail]:= Lo(w); { put ASCII value in buffer }
KbdSeg[TmpTail+1]:= Hi(w); { put extended key code }
if KBDTail > 60 { reached buffer's end ? ... }
then KBDTail:= 30; { ... wrap to first position ! }
end;
end;
{ ************************************************************************** }
procedure InitFKBD;
begin
DisableExtendedKeys; { ensure TP compatibility by default }
end;
{$IFOPT O-}
begin
InitFKBD;
{$ENDIF}
end.